
package venta;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

import cliente.Cliente;
//import producto.IProducto;
import producto.Pedido;
//import producto.Presentacion;
import producto.Producto;
//import producto.Ubicacion;
import static org.mockito.Mockito.*;

public class VtaDirectaTest {
	
	VtaDirecta venta01 = new VtaDirecta();
	VtaDirecta venta02 = new VtaDirecta();
	
	
	Producto productoMock01 = mock(Producto.class);
	Producto productoMock02 = mock(Producto.class);
	Producto productoMock03 = mock(Producto.class);
	Cliente clienteMock01 = mock(Cliente.class);
	Pedido pedidoMock01 = mock(Pedido.class);
	
	VtaDirecta venta03 = new VtaDirecta(pedidoMock01);
	
	Pedido pedido01 = new Pedido();
	
	
	@Before
	public void setUp(){
		venta01.agregarProducto(productoMock01);
		venta01.agregarProducto(productoMock01, 4);
		
		when(productoMock01.precioUnitarioDeVenta()).thenReturn((double) 10);
		
		venta01.confirmarVenta();
		
		venta02.agregarProducto(productoMock03,10);
		venta02.confirmarVenta();
		
		venta03.agregarProducto(productoMock03,5);
		venta03.confirmarVenta();
		
		
	}
	

	@Test
	public void testAgregarProducto() {
		assertEquals(5, venta01.getPedido().getListaDeProductos().size());
	}
	
	@Test
	public void testImporte(){
		assertEquals(50, venta01.importeTotalDeVenta(),.01);
	}
	
	@Test
	public void testConClienteFalse(){
		assertFalse(venta01.conCliente());
	}
	@Test
	public void testConClienteTrue(){
		venta01.asignarCliente(clienteMock01);
		assertTrue(venta01.conCliente());
	}
	@Test
	public void testSinClienteTrue(){
		assertTrue(venta01.sinCliente());
	}
	@Test
	public void testSinClienteFalse(){
		venta01.asignarCliente(clienteMock01);
		assertFalse(venta01.sinCliente());
	}

	@Test
	public void testConfirmarVenta(){
		verify(productoMock01, times(5)).decrementarStock();
	}
	
	@Test
	public void testCancelFull(){
		venta03.cancelacionTotal();
		verify(this.pedidoMock01, times(1)).descontarStock();
		venta01.cancelacionTotal();
		verify(this.productoMock01, times(5)).incrementarStock();
	}
	@Test
	public void testCancelParcialUnProducto1(){
		venta03.cancelacionParcial(productoMock03);
		verify(this.pedidoMock01, times(1)).descontarStock();
		
	}
	@Test
	public void testCancelParcialUnProducto2(){
		
		venta02.cancelacionParcial(productoMock03);
		assertEquals(9,venta02.getPedido().getListaDeProductos().size());
		assertEquals(1,venta02.cancelaciones.size());
		verify(this.productoMock03, times(1)).incrementarStock();
		
	}
	@Test
	public void testCancelParcialUnPedido(){
		
		this.pedido01.agregar(productoMock01);
		this.pedido01.agregar(productoMock01);
		this.pedido01.agregar(productoMock02);
		this.pedido01.agregar(productoMock03); //no deberia poder descontar productos no comprados!!
		
		venta01.agregarProducto(productoMock02); //no deberia poder agregar prod a una vta finalizada!!
		
		assertEquals(6,venta01.getPedido().getListaDeProductos().size());
		
		venta01.cancelacionParcial(pedido01);
		
		assertEquals(3,venta01.getPedido().getListaDeProductos().size());
		
		verify(this.productoMock01, times(2)).incrementarStock();
		verify(this.productoMock02, times(1)).incrementarStock();
		
	}
	
	
}
